Mutexy
Otázka od: Jiri Cincura
5. 6. 2004 22:21
Ahoj,
synchronizuju 2 thready pomoci mutexu, ale aby prvni cekal na druhy, musim
vytvorit Mutex. Ale ja bych ho potreboval vytvotit jeste pred nastartvanim 2
threadu, abych mel 100% jistotu, ze mi 2. nepredbehne 1. Ale to nejde, nebot
tohle (busy-waiting) se nezachyti:
while WaitForSingleObject(FreeDB_Mutex, 200) = WAIT_TIMEOUT do
begin
Application.ProcessMessages;
end;
Jedine misto, kam muzu dat:
FreeDB_Mutex := CreateMutex(nil, True, 'FreeDB_Mutex');
je Execute toho threadu, ale to mam problem s tim predbihanim, takze tam mam
takovyto bastl, ktery pocka na vytvoreni
while WaitForSingleObject(FreeDB_Mutex, 200) = WAIT_FAILED do
begin
Application.ProcessMessages;
end;
slo by tam i Sleep(200) treba, ale kdyby to trvalo dele, slo by to do kytek.
Nevi tedy nekdo, jak vytvorit mutex pred nastartovanim 2. threadu, aby mi to
fungovalo? Ve druhem thradu pak udelam CloseHandle a pokracuje se, ale to
vytvoreni je divne. Asi to musi byt "really" z jineho procesu a to je ten
problem.
btw: chtel jsem tam dat kritickou sekci, ale ta nema TimeOut a stejne mi
nejela, sly obe vlakna zaraz.
--
Jiri Cincura
e-mail: mailto:jiri@cincura.net; mailto:xcincura@informatics.muni.cz
ICQ: 314711544
web: http://www.cincura.net; http://cincura.net/photo
Odpovedá: Petr Fejfar
6. 6. 2004 9:21
Jiri Cincura wrote:
> synchronizuju 2 thready pomoci mutexu, ale aby prvni cekal na
> druhy, musim vytvorit Mutex. Ale ja bych ho potreboval vytvotit jeste
> pred nastartvanim 2 threadu, abych mel 100% jistotu, ze mi 2.
> nepredbehne 1. Ale to nejde, nebot tohle (busy-waiting) se nezachyti:
Mel by ses zamyslet nad tim, k cemu vlastne mutexy a kriticke sekce slouzi
a podivat se, jestli bys pro dany typ synchronizace nenasel vhodnejsi
prostredek
HTH, pf
Odpovedá: Petr Vones
6. 6. 2004 10:54
From: "Jiri Cincura" <jiri@cincura.net>
> je Execute toho threadu, ale to mam problem s tim predbihanim, takze tam mam
> takovyto bastl, ktery pocka na vytvoreni
>
> while WaitForSingleObject(FreeDB_Mutex, 200) = WAIT_FAILED do
> begin
> Application.ProcessMessages;
> end;
Nevolej z aplikace Application.ProcessMessages, a uz vubec ne z jineho nez
hlavniho threadu.
Petr Vones
Odpovedá: Jiri Cincura
6. 6. 2004 11:39
Petr Vones wrote:
>
> Nevolej z aplikace Application.ProcessMessages, a uz vubec ne z
> jineho nez hlavniho threadu.
Ja to volam pouze z hlavniho threadu aplikace. Ceka totiz na dokonceni prace
2. threadu (non main) a chci, aby mi aplikace "reagovala".
Jak mam teda jinak donutit, aby kdyz aplikace "ceka" zpracovala zpravy? A
jak to vubec synchronizovat?
--
Jiri Cincura
e-mail: mailto:jiri@cincura.net; mailto:xcincura@informatics.muni.cz
ICQ: 314711544
web: http://www.cincura.net; http://cincura.net/photo
Odpovedá: Petr Vones
6. 6. 2004 12:08
From: "Jiri Cincura" <jiri@cincura.net>
> Ja to volam pouze z hlavniho threadu aplikace. Ceka totiz na dokonceni prace
> 2. threadu (non main) a chci, aby mi aplikace "reagovala".
Jednoduse, zavolas po dokonceni udalost ktera nastavi nejaky flag (nebo treba
Action) ze se akce dokoncila.
> Jak mam teda jinak donutit, aby kdyz aplikace "ceka" zpracovala zpravy? A
> jak to vubec synchronizovat?
Aplikace (hlavni thread) by nemel nikdy na nic cekat. Ten si vzdy zije svym
zivotem a je predevsim od toho aby obsluhoval uzivatelske rozhrani. Misto toho
by si mel vytvorit logiku aplikace tak, ze definujes stavy ve kterem se prave
nachazi a ty menis napriklad tou udalosti z threadu.
Petr Vones
Odpovedá: Jiri Cincura
6. 6. 2004 12:02
Problem je v tom, ze otevru novy form a ten dela I/O operace (tri HTTP
pozadavky) a to nekdy trva dlouho. Proto jsem ty pozadavky dal do threadu,
abych mohl ten form nechat obsluhovat smycku zprav, ale vysledek tech HTTP
pozadavku potrebuju pro dalsi zpracovani v tom formu. Proto musim cekat, ale
chci, aby ten Form "reagoval".
Nejsem zadnej super expert pres mutli-threading, tak nevim, jak bych to
jinak udelal.
Muzes me teda nakopnout spravnym smerem?
--
Jiri Cincura
e-mail: mailto:jiri@cincura.net; mailto:xcincura@informatics.muni.cz
ICQ: 314711544
web: http://www.cincura.net; http://cincura.net/photo
Odpovedá: Petr Vones
6. 6. 2004 12:26
From: "Jiri Cincura" <jiri@cincura.net>
> Problem je v tom, ze otevru novy form a ten dela I/O operace (tri HTTP
> pozadavky) a to nekdy trva dlouho. Proto jsem ty pozadavky dal do threadu,
> abych mohl ten form nechat obsluhovat smycku zprav, ale vysledek tech HTTP
> pozadavku potrebuju pro dalsi zpracovani v tom formu. Proto musim cekat, ale
> chci, aby ten Form "reagoval".
Stejne tak jako reagujes na stisknuti klavesy, tlacitka mysi, udalost od
timeru budes reagovat i na udalost o zpracovani tech HTTP pozadavku. Windows
jsou (podobne jako byly uz kdysi TurboVision) udalostmi rizene, takze styl
programovani:
Action1;
while WaitingForData do
Wait;
Action2;
je spatny.
Misto toho by si mel definovat stavy:
TAppStatus = (action1, action2);
Rekneme ze status aplikace je action1, v pripade ze prijde udalost od
zpracovani toho pozadavku jej nastavis na action2 a pokracujes. Pri kazde
zmene stavu se provedou potrebne kroky ktere vyplyvaji z logiky aplikace.
Hlavni thread tedy neceka v zadne lokalni smycce, pouze reaguje na udalosti.
Petr Vones
Odpovedá: Jiri Cincura
6. 6. 2004 12:21
Petr Vones wrote:
> TAppStatus = (action1, action2);
>
> Rekneme ze status aplikace je action1, v pripade ze prijde udalost od
> zpracovani toho pozadavku jej nastavis na action2 a pokracujes. Pri
> kazde zmene stavu se provedou potrebne kroky ktere vyplyvaji z logiky
> aplikace. Hlavni thread tedy neceka v zadne lokalni smycce, pouze
> reaguje na udalosti.
Aha, tak to je velice chytre. Je jsem sel cestou nejmensiho odporu a udelal
tam trapny busy-waiting. Jasne pres udalosti to bude asi nejlepsi. Jen to
bude chtit trochu vic usili.
--
Jiri Cincura
e-mail: mailto:jiri@cincura.net; mailto:xcincura@informatics.muni.cz
ICQ: 314711544
web: http://www.cincura.net; http://cincura.net/photo
Odpovedá: Petr Vones
6. 6. 2004 12:30
From: "Jiri Cincura" <jiri@cincura.net>
> Aha, tak to je velice chytre. Je jsem sel cestou nejmensiho odporu a udelal
> tam trapny busy-waiting. Jasne pres udalosti to bude asi nejlepsi. Jen to
> bude chtit trochu vic usili.
Z pocatku to tak vypada. Ale v drtive vetsine pripadu se to vyplati, protoze
se tak snadneji definuje a predevsim po case pripadne pak upravuje logika cele
aplikace.
Petr Vones